﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Filters;
using GestionePolveri2.DAL;
using LinqKit;
using GestionePolveriLib.Facades;

namespace GestionePolveriLib.BL.FilterBags
{
    public class FormulaFilterBag : FilterBase<Formule>, IFilterBase
    {
        private IndicazionePolvere m_indicazionePolvere = IndicazionePolvere.Tutte;

        public IndicazionePolvere IndicazionePolvere
        {
            get { return m_indicazionePolvere; }
            set
            { 
                m_indicazionePolvere = value; 
            }
        }

        public int IDColore { get; set; }
        public string Fornitore { get; set; }
        public string CodicePolvere { get; set; }
        public string Applicazione { get; set; }
        public string Famiglia { get; set; }
        public string TipologiaSM { get; set; }

        public PolvereTypes Tipo { get; set; }
        //public IndicazionePolvere IndicazionePolvere { get; set; }
        public PianoLavori Pianolavori { get; set; }

        public FormulaFilterBag()
        {

        }

        public override System.Linq.Expressions.Expression<Func<Formule, bool>> SetUpFilter()
        {
            var predicate = PredicateBuilder.True<Formule>();

            if (this.UseDates)
            {
                // aggiungi al filtro il controllo sulla data...
            //    predicate = predicate.And(im => (EntityFunctions.TruncateTime(im.DataMovimento) >= EntityFunctions.TruncateTime(this.PeriodFrom)) &&
            //                                     EntityFunctions.TruncateTime(im.DataMovimento) <= EntityFunctions.TruncateTime(this.PeriodTo));
            }

            if (!string.IsNullOrWhiteSpace(CodicePolvere))
            {
                predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagPolveri.CodicePolvere.Equals(CodicePolvere, StringComparison.InvariantCultureIgnoreCase)));
            }

            if (IDColore != -1)
            {
                predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagColori.IDColore == IDColore));
            }

            if (!string.IsNullOrWhiteSpace(Fornitore))
            {
                predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagPolveri.AnagFornitori.Descrizione.Equals(Fornitore, StringComparison.InvariantCultureIgnoreCase)));
            }

            if (!string.IsNullOrWhiteSpace(Applicazione))
            {
                //predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.Applicazione.Trim().ToLower().Contains(Applicazione.Trim().ToLower())));
                predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.Applicazione.Equals(Applicazione, StringComparison.InvariantCultureIgnoreCase)));
            }

            if (!string.IsNullOrWhiteSpace(TipologiaSM))
            {
                //predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.Applicazione.Trim().ToLower().Contains(Applicazione.Trim().ToLower())));
                predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagPolveri.TipologieScortaMinimaPolvere.Codice.Equals(TipologiaSM, StringComparison.InvariantCultureIgnoreCase)));
            }

            switch (Pianolavori)
            {
                case PianoLavori.Tutte:
                    break;
                case PianoLavori.PianoLavoriOnly:
                    predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagColori.IsDiSerie == true));
                    break;
                default:
                    break;
            }

            switch (Tipo)
            {
                case PolvereTypes.Tutte:
                    break;
                case PolvereTypes.Normali:
                    predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagPolveri.IsCodiceCustom == false));
                    break;
                case PolvereTypes.XXXX:
                    predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagPolveri.IsCodiceCustom == true));
                    break;
                default:
                    break;
            }
            
            switch (IndicazionePolvere)
            {
                case IndicazionePolvere.Tutte:
                    break;
                case IndicazionePolvere.Ufficiale:
                    predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.Ufficiale == true));
                    break;
                case IndicazionePolvere.Superata:
                    predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.Superata == true));
                    break;
                default:
                    break;
            }

            if (!string.IsNullOrWhiteSpace(Famiglia))
            {
                string[] arInfo = Famiglia.Split(',');
                int[] iarInfo = new int[arInfo.Length];
                for (int i = 0; i < arInfo.Length; i++)
                {
                    iarInfo[i] = Convert.ToInt32(arInfo[i]);
                }

                //predicate = predicate.And(im => im.ComposizioneColori.Any(x => x.AnagPolveri.FamiglieColoriXPolveri.Famiglie == Famiglia));

                predicate = predicate.And(im => im.ComposizioneColori.Any(x => iarInfo.Contains(x.AnagColori.IDFamiglia)));

                //predicate = predicate.And(im => iarInfo.Contains(im.ComposizioneColori.Any(x => x.AnagColori.IDFamiglia)));
            }

            return predicate;
        }

        public override string ToTraceString()
        {
            string retValue = base.ToTraceString();

            StringBuilder sb = new StringBuilder(base.ToTraceString());

            sb.Append(FilterBagHelper.GetCodiceColoreTraceString(this.IDColore));
            sb.Append(FilterBagHelper.GetFamigliaTraceString(this.Famiglia));
            sb.Append(FilterBagHelper.GetCodicePolvereTraceString(this.CodicePolvere));
            sb.Append(FilterBagHelper.GetApplicazioneTraceString(this.Applicazione));
            sb.Append(FilterBagHelper.GetTipoTraceString(this.Tipo));
            sb.Append(FilterBagHelper.GetIndicazionePolvereTraceString(this.IndicazionePolvere));
            sb.Append(FilterBagHelper.GetFornitoreTraceString(this.Fornitore));

            return sb.ToString();
        }
    }
}
